home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ARASAN_S.ZIP / MOVE.CPP < prev    next >
C/C++ Source or Header  |  1994-02-19  |  2KB  |  113 lines

  1. // Copyright 1994 by Jon Dart.  All Rights Reserved
  2.  
  3. #include "move.h"
  4. #include <iostream.h>
  5. #include <iomanip.h>
  6. extern "C"
  7. {
  8. #include <ctype.h>
  9. #include <string.h>
  10. };
  11.  
  12. static char FileImage( const Square sq )
  13. {
  14.     return 'a' + sq.File() - 1;
  15. }
  16.  
  17. static char RankImage( const Square sq )
  18. {
  19.     return '1' + sq.Rank(White) - 1;
  20. }
  21.  
  22. const char * Move::Image() const
  23. {
  24.     static char image[8];
  25.     if (IsNull())
  26.     {
  27.        strcpy(image,"(null)");
  28.        return image;
  29.     }
  30.     image[0] = FileImage(StartSquare());
  31.     image[1] = RankImage(StartSquare());
  32.     image[2] = '-';
  33.     image[3] = FileImage(DestSquare());
  34.     image[4] = RankImage(DestSquare());
  35.     int i = 5;
  36.     if (my_promotion != Piece::Empty && my_promotion != Piece::Invalid)
  37.     {
  38.        image[i++] = '=';
  39.        image[i++] = Piece::Image(my_promotion);
  40.     }
  41.     image[i] = '\0';
  42.     return image;
  43. }
  44.  
  45. Move &Move::NullMove()
  46. {
  47.     static Move m;
  48.     return m;
  49. }
  50.  
  51. Move Move::Value( char *str, const ColorType color )
  52. {
  53.     char *p = str;
  54.     Square source, dest;
  55.  
  56.     if (strcmp(str,"O-O")==0)
  57.     {
  58.        if (color == White)
  59.           return Move(60,62);
  60.        else
  61.           return Move(4,6);
  62.     }
  63.     else if (strcmp(str,"O-O-O")==0)
  64.     {
  65.        if (color == White)
  66.           return Move(60,58);
  67.        else
  68.           return Move(4,2);
  69.     }
  70.  
  71.     while (isspace(*p)) p++;
  72.     source = Square::Value(p);
  73.     p += 2;
  74.     if (*p == '-' || *p == 'x') p++;
  75.     dest = Square::Value(p);
  76.     if ((source == -1) || (dest == -1))
  77.        return NullMove();
  78.     else
  79.     {
  80.        p += 2;
  81.        Piece::PieceType promotion = Piece::Invalid;
  82.        if (*p == '=')
  83.        {
  84.           // promotion
  85.       p++;
  86.       promotion = Piece::Value(*p);
  87.       // check for promotion to valid piece:
  88.       switch (promotion)
  89.       {
  90.         case Piece::Empty:
  91.         case Piece::Pawn:
  92.            return Move::NullMove();
  93.         case Piece::Knight:
  94.         case Piece::Bishop:
  95.         case Piece::Rook:
  96.         case Piece::Queen:
  97.            break;
  98.         case Piece::King:
  99.         case Piece::Invalid:
  100.            return Move::NullMove();
  101.       }
  102.        }
  103.        Move m(source,dest,promotion);
  104.        return m;
  105.     }
  106. }
  107.  
  108. ostream & operator << (ostream &o, Move &move)
  109. {
  110.     o << move.Image();
  111.     return o;
  112. }
  113.